package com.bawei.coroutine

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import com.bawei.coroutine.databinding.ActivityMainBinding
import kotlinx.coroutines.*

/**
 * 1。协程：不是进程，也不是线程，一段特殊的代码
 * 2。协程和线程的区别？线程是耗费资源，靠CPU调度；协程不耗费资源,靠自己调度
 * 3。特点：优雅的实现异步任务
 *
 *
 *
 *
 *
 *
 */
class MainActivity : AppCompatActivity() {
    private lateinit var activityMainBinding: ActivityMainBinding
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        activityMainBinding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(activityMainBinding.root)
        //顶层的协程作用域,可以传参切换主线程和子线程,不建议使用
//        GlobalScope.launch(Dispatchers.Main){
//            Log.d("ytx", "onCreate: ${Thread.currentThread().name}")
//        }
        //模拟网络请求数据并展示对应的数据
        //第一次请求数据展示数据，再发起一个请求展示数据
//        Thread{
//           var result = getMessageFromNetwork()
//            runOnUiThread{
//                showMessage(result)
//                Thread{
//                    var result2 = getMessageFromNetwork2()
//                    runOnUiThread{
//                        showMessage(result+result2)
//
//                    }
//                }.start()
//            }
//
//        }.start()
        //使用协程优雅解决
        val job = Job()
        CoroutineScope(job).launch(Dispatchers.Main) {
            var  result = withContext(Dispatchers.IO){//耗时操作
                     getMessageFromNetwork()
            }
            showMessage(result)
            var result2 = withContext(Dispatchers.IO){//耗时操作
                getMessageFromNetwork2()
            }
            showMessage(result+result2)

        }
    }



    /**
     * 从服务器取信息:耗时
     */
    private  suspend fun getMessageFromNetwork(): String {

        for (i in 0..1000) {
            Thread.sleep(10)
        }

        var name = "Huanglinqing"
        return name
    }

    /**
     * 从服务器取信息:耗时
     */
    private suspend fun getMessageFromNetwork2(): String {

        for (i in 0..1000) {
            Thread.sleep(1)
        }

        var name = "Huanglinqing222"
        return name
    }


    /**
     * 显示信息:更新UI
     * @message :信息
     */
    private fun showMessage(message: String) {
        activityMainBinding.tv.text = message
    }
}